# 赋值符
#A := $(C)
#B = $(C)
#C = abc
##D = 100ask
#D ?= weidongshan
#
#all :
#	@echo A = $(A)
#	@echo B = $(B)
#	@echo D = $(D)
#	
#C += 123

# foreach函数
#A = a b c
#B = $(foreach tmp, $(A), $(tmp).o)
#
#all : 
#	@echo B = $(B)

# filter函数和filter-out函数
#A = a b c d/
#B = $(filter %/, $(A))
#C = $(filter-out %/, $(A))
#
#all :
#	@echo B = $(B)
#	@echo C = $(C)

# wildcard函数
#file = $(wildcard *.c)
#
#all :
#	@echo file = $(file)
	
# patsubst函数
#files1 = a.c.c b.c abc
#files2 = $(patsubst %.c, %.o, $(files1))
#
#all :
#	@echo flies2 = $(files2)

# subst函数
#files1 = a.c.c b.c abc
#files2 = $(subst .c, .o, $(files1))
#
#all :
#	@echo flies2 = $(files2)

####################################################################################################

# Makefile实例
# 最终目标
TARGET = test
		
# .c文件		
C_SOURCES = a.c b.c c.c		

# .o文件，将%.c格式转换为%.o格式，保存在变量OBJS中
OBJS = $(patsubst %.c, %.o, $(C_SOURCES))

# .d文件，把%.o格式变为.%o.d格式，保存在dep_files变量
# 注意：此处必须定义dep_files为即时变量
dep_files := $(patsubst %.o, .%.o.d, $(OBJS))

# 判断当前路径是否存在.d文件，将结果保存在dep_files变量
# 注意：此处必须定义dep_files为即时变量
dep_files := $(wildcard $(dep_files))

# 目标文件test依赖所有.o文件；
$(TARGET) : $(OBJS)
	gcc -o $(TARGET) $^

# 如果dep_files变量不为空，即存在.d文件，就将其包含到Makefile中，即.o的全部依赖
# 注意：此处操作只能放在$(TARGET)规则之后，$(OBJS)规则之前
# 注意：此处操作的书写格式不能添加任何缩进
ifneq ($(dep_files),)
include $(dep_files)
endif

# .o文件依赖.c文件，通过-MD-MF选项将.o的全部依赖保存在.d文件
%.o : %.c
	gcc -c -o $@ $< -MD -MF .$@.d

# 清理所有的.o文件和目标文件
clean:
	rm $(OBJS) $(TARGET)

# 清理所有的.d文件
distclean:
	@echo dep_files = $(dep_files)
	rm $(dep_files)

# 假想目标
.PHONY: clean distclean
